package main

import (
	"fmt"
)

// 演示指针的基本使用
func func1() {
	var a int = 1
	var p *int // 定义指针类型
	p = &a     // 获取a的地址
	*p += 1    // 读地址的数据
	fmt.Println("func1", a)
}

// go中只有值传递，但是可以通过指针做到引用传递
func func2() {
	var a int = 1
	func_val(a)
	fmt.Println("func2", a)
	func_ref(&a)
	fmt.Println("func2", a)
}

// 值传递，不会改变参数
func func_val(n int) {
	n += 1
}

// 引用传递，就能改变引用的值了
func func_ref(p *int) {
	*p += 1
}

// 使用指针交换两个参数
func func3() {
	a, b := 3, 4
	swap(&a, &b)
	fmt.Println("func3", a, b)
}

func swap(a, b *int) {
	*a, *b = *b, *a
}

func main() {
	fmt.Println("Hello World!")

	func1()
	func2()
	func3()
}
